package base_util

import (
	"github.com/google/uuid"
	"go.uber.org/zap"
	"net"
)

// GetFreePort 获取一个当前可用的端口号
// 该函数通过监听 "localhost:0"，让操作系统自动分配一个空闲端口
// 适用于需要动态获取可用端口的场景，例如：
// - 启动多个服务实例时避免端口冲突
// - 在单元测试中随机分配端口进行测试
func GetFreePort() (int, error) {
	// 解析地址 "localhost:0"，让系统自动分配一个可用端口
	addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
	if err != nil {
		return 0, err // 返回错误信息
	}

	// 监听 TCP 连接，获取可用端口
	l, err := net.ListenTCP("tcp", addr)
	if err != nil {
		return 0, err // 返回错误信息
	}
	defer l.Close() // 监听完成后，关闭端口

	// 获取并返回系统分配的可用端口
	return l.Addr().(*net.TCPAddr).Port, nil
}

// GenerateUUID 生成一个唯一的 UUID (UUIDv4)
// 该函数基于 Google 提供的 github.com/google/uuid 库，生成符合 RFC 4122 标准的 UUID
// UUID 可用于唯一标识，例如：
// - 分布式系统中的唯一请求 ID
// - 数据库记录的主键
// - 任务队列中的唯一任务 ID
func GenerateUUID() string {
	// 生成 UUIDv4（基于随机数）
	id, err := uuid.NewRandom()
	if err != nil {
		// 如果 UUID 生成失败，记录错误日志
		zap.S().Error("无法生成 UUID: %v", err)
	}
	// 返回 UUID 字符串
	return id.String()
}
